#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

typedef long long lld;
const int inf=1<<29;

lld dp1[5050];
lld dp2[5050];
struct
{
	int a[5050],len;
	lld st,ed,sum,maxSum;
	void dpMaxSum()
	{
		dp1[0]=a[0];
		dp2[len-1]=a[len-1];
		sum=maxSum=a[0];
		for(int i=1;i<len;i++)
		{
			dp1[i]=max((lld)a[i],dp1[i-1]+a[i]);
			dp2[len-i-1]=max((lld)a[len-i-1],dp2[len-i]+a[len-i-1]);
			sum+=a[i];
			maxSum=max(maxSum,dp1[i]);
		}
		st=dp2[0];
		ed=dp1[len-1];
	}
} smla[55];
int biga[250500];
int n,m;
lld getRes()
{
	lld res=-inf;
	lld ed=-inf;
	for(int i=1;i<=m;i++)
	{
		int pos=biga[i];
		res=max(res,smla[pos].maxSum);
		res=max(res,ed+smla[pos].st);
	}
	return res;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&smla[i].len);
		for(int j=0;j<smla[i].len;j++)
		{
			scanf("%d",&smla[i].a[j]);
		}
		smla[i].dpMaxSum();
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d",biga+i);
	}
	cout<<getRes()<<endl;
	return 0;
}
